home *** CD-ROM | disk | FTP | other *** search
- /*
- ##########################################################################
- #### ####
- #### The MusicBox Project ####
- #### ============================ ####
- #### ####
- #### ShowCD.c ####
- #### ####
- #### Version 2.1os -- September 29, 2000 ####
- #### ####
- #### Copyright (C) 1994 Thomas Dreibholz ####
- #### 2000 Molbachweg 7 ####
- #### 51674 Wiehl ####
- #### Germany ####
- #### ####
- #### EMail: Dreibholz@bigfoot.com ####
- #### WWW: http://www.bigfoot.com/~dreibholz ####
- #### ####
- ##########################################################################
- */
- /***************************************************************************
- * *
- * This program is free software; you can redistribute it and/or modify *
- * it under the terms of the GNU General Public License as published by *
- * the Free Software Foundation; either version 2 of the License, or *
- * (at your option) any later version. *
- * *
- ***************************************************************************/
-
- /* ShowCD */
-
- #include "MusicBox.h"
- #include "MusicBoxLibrary.h"
-
- #define VERSION 210
- #define VERSTR "$VER: ShowCD 2.1os (Sep 29 2000) - Copyright (C) 1994-2000 by Thomas Dreibholz"
- #define TITEL "ShowCD - Version 2.1os"
-
- #define KatalogLeft 100
- #define KatalogTop 20
- #define KatalogWidth 440
- #define KatalogHeight 205
-
- struct IntuitionBase *IntuitionBase;
- struct GfxBase *GfxBase;
- struct GadToolsBase *GadToolsBase;
- struct Library *WorkbenchBase;
- struct Library *MusicBoxBase;
- struct Library *LocaleBase;
- struct Library *DiskfontBase;
-
- ULONG IDCMPSignalMask,PortSignalMask;
- ULONG WaitSignalMask;
- BOOL USModus;
-
- struct Window *win;
- struct RastPort *rp;
- struct VisualInfo *vi;
- struct Screen *scr;
- struct Gadget *GListe;
- struct Gadget *Gadgets[4];
- struct Katalog *Katalog;
- struct MsgPort *AppPort;
- struct AppWindow *AppWin;
- struct Remember *TitelRemember=NULL;
- struct Locale *Locale;
- struct Catalog *Catalog;
- struct TextFont *Font,*TimesFont;
-
- extern struct WBStartupMsg *WBenchMsg;
- extern struct DiskObject ShowCD;
-
- struct TextAttr TimesAttr=
- {
- "times.font",15,FS_NORMAL,FPF_DISKFONT
- };
-
- struct CNode
- {
- struct Node Node;
- UBYTE Titel[60];
- };
-
- struct NewGadget ListeGadget={5,5,430,170,0L,&TimesAttr,1,0,0,0};
- struct NewGadget OkayGadget={5,180,130,18,0L,&TimesAttr,2,0,0,0};
- struct NewGadget ArcGadget={145,180,150,18,0L,&TimesAttr,3,0,0,0};
- struct NewGadget InfoGadget={305,180,130,18,0L,&TimesAttr,4,0,0,0};
- struct List Liste;
- struct TagItem ListeTags[]={GTLV_Labels,&Liste,
- GTLV_ReadOnly,TRUE,
- TAG_DONE};
- struct TagItem BoolTags[]={GT_Underscore,'_',
- TAG_DONE};
-
- UBYTE *VerStr=VERSTR;
-
- void LadeKatalog();
- void Gesamtkatalog();
- void About();
- void Error();
- LONG MultiRequest();
-
- UBYTE *GS(num,def)
- LONG num;
- UBYTE *def;
- {
- if(Catalog==NULL) return(def);
- return(GetCatalogStr(Catalog,num,def));
- }
-
- void CloseAll()
- {
- if(win) CloseWindow(win);
- if(scr) UnlockPubScreen(NULL,scr);
- if(vi) FreeVisualInfo(vi);
- if(GListe) FreeGadgets(GListe);
- if(Katalog) FreeMem(Katalog,sizeof(struct Katalog));
- if(AppPort) DeletePort(AppPort);
- if(AppWin) RemoveAppWindow(AppWin);
- if(TitelRemember) FreeRemember(TitelRemember);
- if(Font) CloseFont(Font);
- if(LocaleBase)
- {
- if(Catalog) CloseCatalog(Catalog);
- if(Locale) CloseLocale(Locale);
- CloseLibrary(LocaleBase);
- }
- EntferneIcon();
- if(MusicBoxBase) CloseLibrary(MusicBoxBase);
- if(DiskfontBase) CloseLibrary(DiskfontBase);
- if(GadToolsBase) CloseLibrary(GadToolsBase);
- if(WorkbenchBase) CloseLibrary(WorkbenchBase);
- if(IntuitionBase) CloseLibrary(IntuitionBase);
- if(GfxBase) CloseLibrary(GfxBase);
- exit(0);
- }
-
- void OpenAll()
- {
- REGISTER BOOL bool;
- struct TagItem tag[10];
- struct Gadget *g;
-
- if(USModus==FALSE)
- {
- LocaleBase=OpenLibrary("locale.library",38L);
- if(LocaleBase!=NULL)
- {
- Locale=OpenLocale(NULL);
- if(Locale!=NULL)
- Catalog=OpenCatalogA(Locale,"musicbox.catalog",NULL);
- }
- }
- OkayGadget.ng_GadgetText=GS(57,"_Close");
- ArcGadget.ng_GadgetText=GS(58,"_Archive...");
- InfoGadget.ng_GadgetText=GS(80,"A_bout...");
- IntuitionBase=OpenLibrary("intuition.library",37L);
- GfxBase=OpenLibrary("graphics.library",37L);
- if((IntuitionBase==NULL)||(GfxBase==NULL))
- {
- puts(GS(1,"This program requires Kickstart 2.0, V37!"));
- CloseAll();
- }
- GadToolsBase=OpenLibrary("gadtools.library",37L);
- if(GadToolsBase==NULL)
- {
- Error(GS(4,"Unable to open gadtools.library!"));
- CloseAll();
- }
- WorkbenchBase=OpenLibrary("workbench.library",37L);
- if(WorkbenchBase==NULL)
- {
- Error(GS(3,"Unable to open workbench.library"));
- CloseAll();
- }
- DiskfontBase=OpenLibrary("diskfont.library",0L);
- if(DiskfontBase==NULL)
- {
- Error(GS(5,"Unable to open diskfont.library"));
- CloseAll();
- }
- MusicBoxBase=OpenLibrary("musicbox.library",0L);
- if(MusicBoxBase==NULL)
- {
- Error(GS(55,"Unable to open musicbox.library"));
- CloseAll();
- }
- if((LibVersionCheck(VERSION))==0)
- CloseAll();
- Katalog=AllocMem(sizeof(struct Katalog),MEMF_ANY);
- bool=InitIcon();
- if((Katalog==NULL)||(bool==FALSE))
- {
- Error(GS(6,"Not enough memory!"));
- CloseAll();
- }
- AppPort=CreatePort(0L,0L);
- if(AppPort==NULL)
- {
- Error(GS(12,"Unable to create message port"));
- CloseAll();
- }
- Katalog->DiscID=0xFFFFFFFF;
- scr=LockPubScreen(NULL);
- if(scr==NULL)
- {
- Error(GS(26,"Unable to lock public screen!"));
- CloseAll();
- }
- if(scr->Height<300)
- {
- TimesAttr.ta_Name="topaz.font";
- TimesAttr.ta_YSize=9;
- }
- Font=OpenDiskFont(&TimesAttr);
- vi=GetVisualInfoA(scr,NULL);
- if(vi==NULL)
- {
- Error(GS(30,"Unable to get VisualInfo!"));
- CloseAll();
- }
- NewList(&Liste);
- ListeGadget.ng_VisualInfo=vi;
- OkayGadget.ng_VisualInfo=vi;
- ArcGadget.ng_VisualInfo=vi;
- InfoGadget.ng_VisualInfo=vi;
- g=CreateContext(&GListe);
- if(g==NULL)
- {
- Error(GS(31,"Unable to create gadgets!"));
- CloseAll();
- }
- Gadgets[0]=g=CreateGadgetA(LISTVIEW_KIND,g,&ListeGadget,&ListeTags);
- Gadgets[1]=g=CreateGadgetA(BUTTON_KIND,g,&OkayGadget,&BoolTags);
- Gadgets[2]=g=CreateGadgetA(BUTTON_KIND,g,&ArcGadget,&BoolTags);
- Gadgets[3]=g=CreateGadgetA(BUTTON_KIND,g,&InfoGadget,&BoolTags);
- if((Gadgets[0]==0)||(Gadgets[1]==NULL)||(Gadgets[2]==NULL)||(Gadgets[3]==NULL))
- {
- Error(GS(31,"Unable to create gadgets!"));
- CloseAll();
- }
- tag[0].ti_Tag=WA_Left;
- tag[0].ti_Data=KatalogLeft;
- tag[1].ti_Tag=WA_Top;
- tag[1].ti_Data=KatalogTop;
- tag[2].ti_Tag=WA_InnerWidth;
- tag[2].ti_Data=KatalogWidth;
- tag[3].ti_Tag=WA_InnerHeight;
- tag[3].ti_Data=KatalogHeight;
- tag[4].ti_Tag=WA_IDCMP;
- tag[4].ti_Data=CLOSEWINDOW|LISTVIEWIDCMP|IDCMP_GADGETUP|IDCMP_VANILLAKEY;
- tag[5].ti_Tag=WA_Flags;
- tag[5].ti_Data=ACTIVATE|WINDOWCLOSE|WINDOWDEPTH|WINDOWDRAG|SMART_REFRESH|GIMMEZEROZERO;
- tag[6].ti_Tag=WA_Gadgets;
- tag[6].ti_Data=GListe;
- tag[7].ti_Tag=WA_Title;
- tag[7].ti_Data=TITEL;
- tag[8].ti_Tag=WA_PubScreen;
- tag[8].ti_Data=scr;
- tag[9].ti_Tag=TAG_DONE;
- win=OpenWindowTagList(NULL,&tag);
- if(win==NULL)
- {
- Error(GS(33,"Unable to open window!"));
- CloseAll();
- }
- GTRefreshWindow(win,NULL);
- IDCMPSignalMask=(1L<<win->UserPort->mp_SigBit);
- PortSignalMask=(1L<<AppPort->mp_SigBit);
- WaitSignalMask=IDCMPSignalMask+PortSignalMask;
- AppWin=AddAppWindowA(1,0,win,AppPort,NULL);
- if(AppWin==NULL)
- {
- Error(GS(56,"Unable to init AppWindow!"));
- CloseAll();
- }
- }
-
- void main(argc,argv)
- long argc;
- UBYTE *argv[];
- {
- REGISTER ULONG Class,Signale;
- REGISTER UWORD Code;
- register BOOL ende;
- register struct IntuiMessage *msg;
- register struct WBArg *arg;
- register struct Gadget *gad;
- register struct AppMessage *app;
- register struct FileLock *lock;
- int test;
-
- OpenAll();
-
- if(argc>1)
- {
- if(!(strcmp(argv[1],"?")))
- {
- printf("USAGE: %s [catalog file] [-u|US]\n",argv[0]);
- exit(0);
- }
- else
- LadeKatalog(argv[1]);
- for(test=1;test<argc;test++)
- {
- if(!(strcmp(argv[test],"-u"))) USModus=TRUE;
- if(!(strcmp(argv[test],"US"))) USModus=TRUE;
- }
- }
-
- else if(WBenchMsg!=NULL)
- if(WBenchMsg->sm_NumArgs>1)
- {
- arg=(ULONG)WBenchMsg->sm_ArgList+(ULONG)sizeof(struct WBArg);
- lock=CurrentDir(arg->wa_Lock);
- LadeKatalog(arg->wa_Name);
- CurrentDir(lock);
- }
- ende=FALSE;
- do
- {
- Signale=Wait(WaitSignalMask);
- if(Signale & IDCMPSignalMask)
- {
- msg=GTGetIMsg(win->UserPort);
- while(msg!=NULL)
- {
- Class=msg->Class;
- Code=msg->Code;
- gad=msg->IAddress;
- GTReplyIMsg(msg);
- switch(Class)
- {
- case CLOSEWINDOW:
- ende=TRUE;
- break;
- case GADGETUP:
- switch(gad->GadgetID)
- {
- case 2:
- ende=TRUE;
- break;
- case 3:
- Gesamtkatalog();
- break;
- case 4:
- About();
- break;
- }
- break;
- case VANILLAKEY:
- switch((UBYTE)toupper(Code))
- {
- case 'C':
- case 'S':
- ende=TRUE;
- break;
- case 'B':
- About();
- case 'A':
- Gesamtkatalog();
- break;
- }
- break;
- }
- msg=GTGetIMsg(win->UserPort);
- }
- }
- if(Signale & PortSignalMask)
- {
- app=GetMsg(AppPort);
- while(app!=NULL)
- {
- if(app->am_Type=MTYPE_APPWINDOW)
- {
- arg=app->am_ArgList;
- lock=CurrentDir(arg->wa_Lock);
- LadeKatalog(arg->wa_Name);
- CurrentDir(lock);
- }
- ReplyMsg(app);
- app=GetMsg(AppPort);
- }
- }
- } while(ende==FALSE);
- CloseAll();
- }
-
- void LadeKatalog(name)
- UBYTE *name;
- {
- struct TagItem tag[2];
- register struct FileHandle *fh;
- register struct CNode *node;
- register int i;
-
- SleepPointer(win);
- fh=Open(name,MODE_OLDFILE);
- if(fh!=NULL)
- {
- Katalog->Anzahl=99;
- Read(fh,Katalog,KSIZE(Katalog));
- Close(fh);
- if((strncmp(&Katalog->ID,"DISC",4)))
- {
- Katalog->DiscID=0xFFFFFFFF;
- ClearPointer(win);
- return;
- }
- NewList(&Liste);
- if(TitelRemember)
- FreeRemember(TitelRemember,TRUE);
- TitelRemember=NULL;
- node=AllocRemember(&TitelRemember,sizeof(struct CNode),MEMF_ANY|MEMF_CLEAR);
- if(node==NULL)
- {
- Error(GS(6,"Not enough memory!"));
- CloseAll();
- }
- node->Node.ln_Name=&node->Titel;
- sprintf(&node->Titel,"%s:",&Katalog->CDName);
- AddTail(&Liste,node);
- for(i=0;i<Katalog->Anzahl;i++)
- {
- node=AllocRemember(&TitelRemember,sizeof(struct CNode),MEMF_ANY|MEMF_CLEAR);
- if(node==NULL)
- {
- Error(GS(6,"Not enough memory!"));
- CloseAll();
- }
- node->Node.ln_Name=&node->Titel;
- if(scr->Height>299)
- sprintf(&node->Titel,"%02d %s",i+1,&Katalog->KE[i].Titel);
- else
- sprintf(&node->Titel,"%02d %s",i+1,&Katalog->KE[i].Titel);
- AddTail(&Liste,node);
- }
- tag[0].ti_Tag=GTLV_Labels;
- tag[0].ti_Data=&Liste;
- tag[1].ti_Tag=TAG_DONE;
- GTSetGadgetAttrsA(Gadgets[0],win,NULL,&tag);
- }
- ClearPointer(win);
- }
-
- void Gesamtkatalog()
- {
- SleepPointer(win);
- OpenArchive(Katalog->DiscID,0,0);
- ClearPointer(win);
- }
-
- LONG MultiRequest(titel,text,gads)
- UBYTE *titel,*text,*gads;
- {
- struct EasyStruct easy;
-
- easy.es_StructSize=sizeof(struct EasyStruct);
- easy.es_Flags=0;
- easy.es_Title=titel;
- easy.es_TextFormat=text;
- easy.es_GadgetFormat=gads;
- return(EasyRequestArgs(NULL,&easy,0L,0L));
- }
-
- void Error(text)
- {
- MultiRequest(GS(15,"Music Box - Error!"),text,GS(16,"Abort"));
- }
-
- void About()
- {
- UBYTE tex[12];
- struct InfoStruct info;
-
- sprintf(&tex,"#%08lx",Katalog->DiscID);
- info.Title=GS(81,"ShowCD - Information");
- info.ProgName=TITEL;
- info.Icon=&ShowCD;
- if(scr->Height>270) info.LowRes=FALSE; else info.LowRes=TRUE;
- info.Text[0].LeftEdge=95;
- info.Text[0].TopEdge=95;
- info.Text[0].Flags=ISTF_LEFT;
- info.Text[0].Text=GS(18,"Current CD:");
- info.Text[1].LeftEdge=95;
- info.Text[1].TopEdge=110;
- info.Text[1].Flags=ISTF_LEFT;
- info.Text[1].Text=GS(19,"ID number:");
- if(Katalog->DiscID!=0xFFFFFFFF)
- {
- info.Text[2].LeftEdge=180;
- info.Text[2].TopEdge=95;
- info.Text[2].Flags=ISTF_LEFT;
- info.Text[2].Text=&Katalog->CDName;
- info.Text[3].LeftEdge=180;
- info.Text[3].TopEdge=110;
- info.Text[3].Flags=ISTF_LEFT;
- info.Text[3].Text=&tex;
- info.Text[4].LeftEdge=0;
- }
- else
- info.Text[2].LeftEdge=0;
- info.RegInfo = "";
- SleepPointer(win);
- InformationA(&info);
- ClearPointer(win);
- }
-
-